import { Fields, TableAction } from "@/types/public";
import { Button, Popconfirm, Space, Tag } from "antd";
import React from "react";
import { EditOutlined, DeleteOutlined } from "@ant-design/icons";
import { getOptionValueFromTable, HearderType } from "@/common/common";
import { httpClient } from "@/common/httpClient";
export type Mode = "R" | "W" | "C";
// 主键定义（与表结构主键对应）
export const PrimaryKey = "id";

const getRegisterValue = async (param: {}) => {
  return await httpClient.post(
    "/admin/device_register/send",
    {
      ...param,
    },
    {
      headers: { "Content-Type": HearderType[0] },
    }
  );
};

// 设备寄存器数据结构定义（小驼峰命名，对应表字段）
export interface DeviceRegisterField {
  /** 寄存器唯一标识 */
  id: number;

  /** 关联的功能ID（关联device_node表的nodeId） */
  nodeId: number;

  /** 从设备节点名称 (对应UI界面"名称"输入框) */
  registerName: string;

  /** 显示排序序号 (对应UI界面加减按钮控件)，默认0 */
  sortOrder: number;

  /** 寄存器/偏移量 (对应UI界面"寄存器/偏移量"输入框) */
  registerOffset: string;

  /** 数据类型 (对应UI界面下拉选择项，选项:配置属性/采集属性)，默认"配置属性" */
  dataType: string;

  /** 数据格式 (对应UI界面下拉选择项，如8位无符号数/16位有符号数)，默认"8位无符号数" */
  dataFormat: string;

  dataOrder: string; //大小端

  /** 字节格式 (对应UI界面下拉选择项，如BYTE/WORD/DWORD)，默认"BYTE" */
  byteFormat: string;

  /** 读写权限: R-只读,W-只写,RW-读写 (对应UI界面读写方式下拉选择)，默认"R" */
  rwPermission: string;

  /** 平台→设备转换公式 (如"x*100") (对应UI界面公式处理控件)，可选 */
  platformToDeviceFormula?: string;

  /** 设备→平台转换公式 (如"x/100") (对应UI界面公式处理控件)，可选 */
  deviceToPlatformFormula?: string;

  /** 参数配置集合 (键值对存储，对应UI界面参数配置控件)，JSON格式，可选 */
  params?: Record<string, any>;

  /** 创建时间，自动生成 */
  createdAt: string | Date;

  /** 最后修改时间，自动生成 */
  updatedAt: string | Date;

  //从设备地址
  slaveAddress: number;

  getter: any;

  groupId: number;

  extents?: {
    // id: record?.id,
    // groupId: groupId,
    // slaveId: slaveId,
    // deviceId: deviceId,
    // mode: "R",
    // value: modeValue,
  };
  //数据库拓展字段
  extendsJson: string;
}

export const createDeviceRegisterField = async (
  tableAction: TableAction<DeviceRegisterField> = {}
): Promise<Fields[]> => {
  // // 1. 异步获取关联的功能ID选项（关联device_node表，获取nodeId和nodeName）
  // const nodeOptions: any[] = await getOptionValueFromTable(
  //   "device_nodes", // 关联的表名
  //   {}, // 查询条件（无筛选时传空对象）
  //   ["nodeId", "nodeName"] // 需返回的字段：value取nodeId，title取nodeName
  // );
  let nodeOptions: any = [];
  // 2. 数据类型下拉选项（对应表COMMENT的"配置属性/采集属性"）
  const dataTypeOptions = [
    { value: "0", label: "无符号" },
    { value: "1", label: "有符号" },
  ];

  // 3. 数据格式下拉选项（常见格式，对应表COMMENT示例）
  const dataFormatOptions = [
    { value: "8", label: "8位" },
    { value: "16", label: "16位" },
  ];

  // 4. 字节格式下拉选项（对应表COMMENT的"BYTE/WORD/DWORD"）
  const byteFormatOptions = [
    { value: "BYTE", label: "BYTE(1字节)" },
    { value: "WORD", label: "WORD(2字节)" },
    { value: "DWORD", label: "DWORD(4字节)" },
    { value: "QWORD", label: "QWORD(8字节)" },
  ];

  // 5. 读写权限下拉选项（对应表COMMENT的"R-只读,W-只写,RW-读写"）
  const rwPermissionOptions = [
    { value: "R", label: "只读(R)" },
    { value: "W", label: "只写(W)" },
    { value: "RW", label: "读写(RW)" },
  ];
  return [
    // 主键ID（禁用编辑，仅展示）
    {
      valueType: "number",
      inputType: "input",
      key: "id",
      title: "序列号",
      dataIndex: "id",
      width: 80,
      disabled: true,
      isEdit: false,
      visible: true,
      tooltip: "寄存器唯一标识",
    },
    {
      valueType: "number",
      inputType: "input",
      key: "groupId",
      title: "分组",
      dataIndex: "groupId",
      width: 80,
      isEdit: false,
      visible: true,
      tooltip: "分组",
    },
    // 寄存器名称（必填，限制255字符）
    {
      valueType: "string",
      inputType: "input",
      key: "registerName",
      title: "寄存器名称",
      width: 150,
      dataIndex: "registerName",
      placeholder: "请输入从设备节点名称",
      rules: [
        { required: true, message: "寄存器名称不能为空" },
        { max: 255, message: "名称长度不能超过255字符" },
      ],
      tooltip: '从设备节点名称（对应UI界面"名称"输入框）',
    },

    // 排序值（必填，默认0）
    {
      valueType: "number",
      inputType: "input",
      key: "sortOrder",
      title: "排序序号",
      dataIndex: "sortOrder",
      placeholder: "请输入排序序号",
      initialValue: 0,
      visible: false,
      rules: [{ required: true, message: "排序序号不能为空" }],
      tooltip: "显示排序序号（对应UI界面加减按钮控件），默认0",
    },
    // 寄存器/偏移量（必填，限制20字符）
    {
      valueType: "string",
      inputType: "input",
      key: "registerOffset",
      title: "寄存器/偏移量",
      dataIndex: "registerOffset",
      width: 130,
      placeholder: "请输入寄存器地址（如0x0001）",
      rules: [
        { required: true, message: "寄存器/偏移量不能为空" },
        { max: 20, message: "地址长度不能超过20字符" },
      ],
      tooltip: '寄存器/偏移量（对应UI界面"寄存器/偏移量"输入框）',
      render: (v) => {
        return v.split(",").map((item: string) => {
          return <Tag color="success">{item}</Tag>;
        });
      },
    },

    // 数据类型（下拉选择，默认"配置属性"）
    {
      valueType: "string",
      inputType: "select",
      key: "dataType",
      title: "数据类型",
      dataIndex: "dataType",
      width: 90,
      placeholder: "请选择数据类型",
      options: dataTypeOptions,
      initialValue: "配置属性",
      rules: [{ required: true, message: "数据类型不能为空" }],
      tooltip: "数据类型（对应UI界面下拉选择项，选项：配置属性/采集属性）",
    },

    // 数据格式（下拉选择，默认"8位无符号数"）
    {
      valueType: "string",
      inputType: "select",
      key: "dataFormat",
      title: "数据格式",
      dataIndex: "dataFormat",
      width: 150,
      placeholder: "请选择数据格式",
      options: dataFormatOptions,
      initialValue: "8位无符号数",
      rules: [{ required: true, message: "数据格式不能为空" }],
      tooltip: "数据格式（对应UI界面下拉选择项，如8位无符号数/16位有符号数）",
    },
    {
      valueType: "string",
      inputType: "select",
      key: "dataOrder",
      title: "端选择",
      dataIndex: "dataOrder",
      placeholder: "端选择：AB/BA",
      options: [
        { label: "大端AB", value: "AB" },
        { label: "小端BA", value: "BA" },
        { label: "拼接", value: "A" },
      ],
      width: 90,
      initialValue: "AB",
      rules: [{ required: true, message: "端选择不能为空" }],
    },
    // 字节格式（下拉选择，默认"BYTE"）
    {
      valueType: "string",
      inputType: "select",
      key: "byteFormat",
      title: "字节格式",
      dataIndex: "byteFormat",
      placeholder: "请选择字节格式",
      options: byteFormatOptions,
      width: 90,
      initialValue: "BYTE",
      rules: [{ required: true, message: "字节格式不能为空" }],
      tooltip: "字节格式（对应UI界面下拉选择项，如BYTE/WORD/DWORD）",
    },

    // 读写权限（下拉选择，默认"R"）
    {
      valueType: "string",
      inputType: "select",
      key: "rwPermission",
      title: "读写权限",
      dataIndex: "rwPermission",
      placeholder: "请选择读写权限",
      options: rwPermissionOptions,
      initialValue: "R",
      width: 90,

      rules: [{ required: true, message: "读写权限不能为空" }],
      tooltip:
        "读写权限：R-只读、W-只写、RW-读写（对应UI界面读写方式下拉选择）",
    },
    {
      valueType: "string",
      inputType: "hidden",
      key: "extents",
      title: "extents",
      disabled: true,
      visible: false,
      dataIndex: "extents",
      placeholder: "拓展字段",
    },

    {
      valueType: "string",
      inputType: "hidden",
      key: "extendsJson",
      title: "extendsJson",
      disabled: true,
      visible: false,
      dataIndex: "extendsJson",
      placeholder: "数据库拓展字段",
      defaultValue: "{}",
    },
    // 平台→设备公式（可选）
    {
      valueType: "string",
      inputType: "editor",
      key: "platformToDeviceFormula",
      title: "平台→设备公式",
      disabled: true,
      visible: false,
      dataIndex: "platformToDeviceFormula",
      placeholder: '如"x*100"（平台下发到设备的转换公式）',
      tooltip: "平台→设备转换公式（对应UI界面公式处理控件）",
      // rawvalue: async (row: DeviceRegisterField) => {
      //   return await getRegisterValue(row.extents || {});
      // },
    },

    // 设备→平台公式（可选）
    {
      valueType: "string",
      inputType: "editor",
      key: "deviceToPlatformFormula",
      title: "设备→平台公式",
      disabled: true,
      rawvalue: async (row: DeviceRegisterField) => {
        return await getRegisterValue(row.extents || {});
      },
      visible: false,
      dataIndex: "deviceToPlatformFormula",
      placeholder: '如"x/100"（设备上传到平台的转换公式）',
      tooltip: "设备→平台转换公式（对应UI界面公式处理控件）",
    },

    // 参数配置集合（JSON格式，可选，多行输入）
    {
      valueType: "string",
      inputType: "textarea",
      key: "params",
      title: "参数配置",
      visible: false,
      dataIndex: "params",
      placeholder: '请输入JSON格式的参数配置（如{"timeout":5000,"retry":3}）',
      defaultValue: "{}",
      autoSize: { minRows: 3, maxRows: 6 },
      tooltip: "参数配置集合（键值对存储，对应UI界面参数配置控件）",
    },

    // 创建时间（禁用编辑，仅展示）
    {
      valueType: "string",
      inputType: "date-picker",
      key: "createdAt",
      title: "创建时间",
      dataIndex: "createdAt",
      disabled: true,
      visible: true,
      tooltip: "记录创建时间（自动生成）",
    },

    // 更新时间（禁用编辑，仅展示）
    {
      valueType: "string",
      inputType: "date-picker",
      key: "updatedAt",
      title: "最后修改时间",
      dataIndex: "updatedAt",
      disabled: true,
      visible: true,
      tooltip: "记录最后修改时间（自动生成）",
    },

    // 操作列（编辑/删除）
    {
      title: "操作",
      key: "action",
      fixed: "right",
      width: 200,
      render: (_: any, record: DeviceRegisterField) => (
        <Space size="middle">
          <Button
            type="link"
            size="small"
            icon={<EditOutlined />}
            onClick={() => tableAction.custom?.(record)}
          >
            测试指令
          </Button>
          {/* 编辑按钮 */}
          <Button
            type="link"
            size="small"
            icon={<EditOutlined />}
            onClick={() => tableAction.edit?.(record)}
          >
            编辑
          </Button>

          {/* 删除按钮（带确认弹窗） */}
          <Popconfirm
            title="确定删除该寄存器配置？"
            description="删除后将无法恢复，且可能影响设备数据采集/控制功能"
            onConfirm={() => tableAction.delete?.([record.id])}
            okText="确认"
            cancelText="取消"
          >
            <Button type="link" danger icon={<DeleteOutlined />}>
              删除
            </Button>
          </Popconfirm>
        </Space>
      ),
    },
  ];
};
